package com.parking.mgr.common.exception.enums;


import com.parking.mgr.common.annotion.ExpEnumType;
import com.parking.mgr.common.constant.ExpEnumConstant;
import com.parking.mgr.common.exception.BaseException;
import com.parking.mgr.common.exception.PermissionException;
import com.parking.mgr.common.exception.asserts.Assertion;
import com.parking.mgr.common.factory.ExpEnumCodeFactory;

/**
 * @ClassName PermissionExceptionEnum
 * @Description 授权和鉴权异常的枚举
 *              认证和鉴权的区别：
 *              认证可以证明你能登录系统，认证的过程对校验token的过程
 *              鉴权可以证明你有系统的哪些权限，鉴权的过程是校验角色是否包含某些接口的权限
 * @Auther: zhijianpu
 * @Date: 2023/5/19
 */
@ExpEnumType(module = ExpEnumConstant.CORE_MODULE_EXP_CODE, kind = ExpEnumConstant.PERMISSION_EXCEPTION_ENUM)
public enum PermissionExceptionEnum implements IBaseExceptionEnum, Assertion {
    /**
     * 资源路径不存在
     */
    URL_NOT_EXIST(1, "资源路径不存在，请检查请求地址"),

    /**
     * 没有权限访问资源
     */
    NO_PERMISSION(2, "没有权限访问资源，请联系管理员"),

    /**
     * 没有权限操作该数据
     */
    NO_DATA_PERMISSION(3, "没有该数据权限，请联系管理员");

    private final Integer code;

    private final String message;

    PermissionExceptionEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    @Override
    public Integer getCode() {
        return ExpEnumCodeFactory.getExpEnumCode(this.getClass(), code);
    }

    @Override
    public String getMessage() {
        return message;
    }


    @Override
    public BaseException onAssertFailed(String errorMessage) {
        if (errorMessage == null || errorMessage.isEmpty()) {
            return new PermissionException(this);
        } else {
            return new PermissionException(this.getCode(), errorMessage);
        }
    }
}
